home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
tools
/
cd2pcmt
/
source.lzh
/
scsi_cmd.c
< prev
next >
Wrap
Text File
|
1997-10-01
|
4KB
|
186 lines
#include <TNB.H>
#include "extern.h"
/* SCSI コマンド実行処理 */
/*********************************************
int scsi_cmd(
int id
SCSI-ID
int len
CDB の長さ
unsigned char *buf
CDB のアドレス
int rlen
データ読み込みの場合、バイト数
データ書き込みの場合、バイト数|0x80000000
0ならデータ読み込み無し
unsigned char *buf2
データアドレス
*********************************************/
int scsi_cmd( int len, unsigned char *buf, int rlen, unsigned char *buf2 )
{
int rc;
register int ID asm("d4");
ID=SCSI_ID;
/* セレクションフェーズ */
rc = S_SELECT(ID);
if ( rc!=0 ) return(-1);;
/* コマンドフェース */
buf[1]=(buf[1]&0x1F)|(ID/0x10000*0x20);
rc = S_CMDOUT( len, buf );
if ( rc!=0 ) return(-1);;
if ( rlen != 0 ){
/* データインフェーズ */
if ( dma_fg==0 ) /* DMAC使用フラグ*/
rc = S_DATAIN_P( rlen, buf2 );
else rc = S_DATAIN( rlen, buf2 );
if ( rc==-1 )
return(-1);
if ( mach2_fg==0 && rc==-2 ){
rc=scsi_cmd_sm();
if ( rc!=0 )
return(rc);
return(-2);;
}
}
return( scsi_cmd_sm() );
}
/*+++++++++++++*/
int scsi_cmd__( int len, unsigned char *buf, int rlen, unsigned char *buf2 )
{
int rc;
register int ID asm("d4");
ID=SCSI_ID;
/* セレクションフェーズ */
rc = S_SELECT(ID);
if ( rc!=0 ) return(-1);;
/* コマンドフェース */
buf[1]=(buf[1]&0x1F)|(ID/0x10000*0x20);
rc = S_CMDOUT( len, buf );
if ( rc!=0 ) return(-1);;
if ( rlen != 0 ){
/* データインフェーズ */
if ( dma_fg==0 ){ /* DMAC使用フラグ*/
if ( sct_fg!=0 ){
rc = S_DATAIN_PI( rlen, buf2 );
} else if ( stm_fg==0 ){
rc = S_DATAIN_P( rlen, buf2 );
} else {
rc = S_DATAIN_M( rlen, buf2 );
}
} else {
rc = S_DATAIN( rlen, buf2 );
}
if ( rc==-1 )
return(-1);
if ( mach2_fg==0 && rc==-2 ){
rc=scsi_cmd_sm();
if ( rc!=0 )
return(rc);
return(-2);;
}
}
return( scsi_cmd_sm() );
}
/*++++++++++++++*/
int scsi_cmd_sm()
{
unsigned char status,msg;
int rc;
/* ステイタスフェーズ */
rc = S_STSIN( &status );
if ( rc!=0 ) return(-1);;
/* メッセージフェーズ */
rc = S_MSGIN( &msg );
if ( rc!=0 ) return(-1);
return( msg*0x10000 + status );
}
asm("
_S_DATAIN_PI::
move.l d3,-(sp)
move.l 4+4(sp),d3
move.l 4+8(sp),a1
move.l #$13,d1 * S_DATAIN_PI
moveq #$F5,d0
trap #15
move.l (sp)+,d3
rts
_S_DATAIN_M::
move.l d3,-(sp)
move.l 4+4(sp),d3
move.l 4+8(sp),a1
move.l #$14,d1 * S_DATAIN_M
moveq #$F5,d0
trap #15
move.l (sp)+,d3
rts
_S_DATAIN_P::
move.l d3,-(sp)
move.l 4+4(sp),d3
move.l 4+8(sp),a1
move.l #$0B,d1 * S_DATAIN_P
moveq #$F5,d0
trap #15
move.l (sp)+,d3
rts
_S_DATAOUT_P::
move.l d3,-(sp)
move.l 4+4(sp),d3
move.l 4+8(sp),a1
move.l #$0C,d1 * S_DATAOUT_P
moveq #$F5,d0
trap #15
move.l (sp)+,d3
rts
_S_LEVEL_::
move.l #$0A,d1
moveq #$F5,d0
trap #15
rts
_S_MODESELECT::
movem.l d3-d4,-(sp)
move.l $000c(sp),d2
moveq #$00,d3
move.w $0012(sp),d3
move.l $0014(sp),d4
movea.l $0018(sp),a1
move.l #$2A,d1 * MODESELECT
moveq #$F5,d0
trap #15
movem.l (sp)+,d3-d4
rts
_S_MODESENSE::
movem.l d3-d4,-(sp)
move.l $000c(sp),d2
moveq #$00,d3
move.w $0012(sp),d3
move.l $0014(sp),d4
movea.l $0018(sp),a1
move.l #$29,d1 * MODESENSE
moveq #$F5,d0
trap #15
movem.l (sp)+,d3-d4
rts
_S_TW_CHK::
move.l #$1E,d1
moveq #$F5,d0
trap #15
rts
_S_TW_LEVEL::
move.l d4,-(sp)
move.l 4+4(sp),d4
move.l #$20A,d1
moveq #$F5,d0
trap #15
move.l (sp)+,d4
rts
");